package com.dyp.filterdemo.web.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 无侵入扩展：HttpServletRequestWrapper通过装饰器模式新增功能，不破坏原有对象。
 * Servlet规范明确要求容器实现必须保证getParameterMap()返回不可变Map，而Wrapper是规范推荐的扩展方式。
 * 比如：Servlet容器都通过Collections.unmodifiableMap() 或类似机制返回不可修改的Map视图。
 */
public class ModifyParamRequestWrapper extends HttpServletRequestWrapper {
    private final Map<String, String[]> customParams = new HashMap<>();

    public ModifyParamRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    // 添加新参数（线程安全）
    public void addParameter(String name, String value) {
        customParams.put(name,  new String[]{value});
    }

    // 重写关键方法以合并原始参数和自定义参数
    @Override
    public String getParameter(String name) {
        if (customParams.containsKey(name))  {
            return customParams.get(name)[0];
        }
        return super.getParameter(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> originalMap = super.getParameterMap();
        Map<String, String[]> mergedMap = new HashMap<>(originalMap);
        mergedMap.putAll(customParams);
        return Collections.unmodifiableMap(mergedMap);
    }
}
